package com.itheima.ws;

import javax.servlet.http.HttpSession;
import javax.sql.rowset.serial.SerialJavaObject;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;


public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {

    /**
     * 关于这个修改握手，我的理解
     * websocket是有握手阶段的，在了解websocket协议之后，已经知道握手是通过一次http请求来完成的，
     * 既然是http，就会有session(session保存在服务器，通过浏览器的cookie找到对应的，忘了可以百度回顾下)
     * 所以在握手阶段的请求里，我们是可以拿到session的。
     *
     * 拓展思考：在这里，是把登录的用户名存在session中，然后通过这个session中保存到对应的Endpoint中
     * 每次用户发消息，需要知道是谁发的，所以从session获取用户名
     * 在名通im的开发中，可以用这种Httpsession的方式来做吗?在微服务下，ws建立连接的握手和session是不是
     * 都在一个服务上？我感觉ws是长连接应该就没有像http那种由于负载均衡到时请求打到不同的服务上的问题呢？
     * 但在这里登陆接口用户名存入session还是http接口，就存在这个问题，所以用session来作为endpoint的唯一标识应该不行
     * 有啥办法吗？想了下也不一定要用session，这里是用session作为一个EndPoint的成员变量，每次从session中取用户名
     * 但其实直接用用户名或者id作为一个成员变量也可。
     * 到时候im开发时，登陆后该怎么玩呢？怎么标识一个ws session属于哪个用户呢？ws建立的时候就可以传参，可以传，反正方法
     * 应该很多种，到时候再说
     * @param config
     * @param request
     * @param response
     */
    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
        //ServerEndpointConfig这个EndpointConfig在onOpen中有用到
        HttpSession httpSession = (HttpSession) request.getHttpSession();
        config.getUserProperties().put(HttpSession.class.getName(), httpSession);
    }
}
